#include "JSonReader.h"

#include <fstream>
#include <sstream>

JSonReader::JSonReader(std::string nombreArchivo) { 
	Json::Value root;
	Json::Reader reader;
	
	std::ifstream archivo(nombreArchivo);
	std::stringstream ss;
	
	std::map<std::pair<int, int>, Candy*>* imagenes = new std::map<std::pair<int, int>, Candy*>();
	
	int cantColumnas, cantFilas;
	
	configuracionGeneral = new GeneralConfiguration();
	configuracionTablero = new BoardConfiguration();
	
	/* Si se abrió el archivo, lo parseo */
	if (archivo.good()) {
		ss << archivo.rdbuf();
		
		reader.parse(ss.str(), root);
		archivo.close();
	}
		
	// Tomo los valores caracteristicos del tablero
	cantColumnas = root["cantColumnas"].asInt();
	cantFilas = root["cantFilas"].asInt();
	
    configuracionGeneral->setCantidadColumnas(cantColumnas);
    configuracionGeneral->setCantidadFilas(cantFilas);
    configuracionGeneral->setImagenFondo(root["imagenFondo"].asString());
    configuracionGeneral->setMaximoJugadores(root["maxJugadores"].asInt());
    configuracionGeneral->setNombreNivel(root["nombreNivel"].asString());
    configuracionGeneral->setPuntajeRequerido(root["puntajeRequerido"].asInt());
	configuracionGeneral->setSonidoMovimiento(root["sonidoMovimiento"].asString());
	configuracionGeneral->setSonidoCombinacion(root["sonidoCombinacion"].asString());

    // Tomo las probabilidades por celda y por columna
    const Json::Value probabilidadesPorCelda =
                                root["probabilidades"]["celda"];
    const Json::Value probabilidadesPorColumna =
                                root["probabilidades"]["columna"];

	std::cout << probabilidadesPorCelda["button"]["b"].asDouble() << std::endl;

    configuracionGeneral->setCeldaBlueButton(probabilidadesPorCelda["button"]["b"].asDouble());
    configuracionGeneral->setCeldaGreenButton(probabilidadesPorCelda["button"]["g"].asDouble());
    configuracionGeneral->setCeldaRedButton(probabilidadesPorCelda["button"]["r"].asDouble());
    configuracionGeneral->setCeldaVioletButton(probabilidadesPorCelda["button"]["v"].asDouble());
    configuracionGeneral->setCeldaYellowButton(probabilidadesPorCelda["button"]["y"].asDouble());

    configuracionGeneral->setCeldaBlueMiniBar(probabilidadesPorCelda["miniBar"]["b"].asDouble());
    configuracionGeneral->setCeldaGreenMiniBar(probabilidadesPorCelda["miniBar"]["g"].asDouble());
    configuracionGeneral->setCeldaRedMiniBar(probabilidadesPorCelda["miniBar"]["r"].asDouble());
    configuracionGeneral->setCeldaVioletMiniBar(probabilidadesPorCelda["miniBar"]["v"].asDouble());
    configuracionGeneral->setCeldaYellowMiniBar(probabilidadesPorCelda["miniBar"]["y"].asDouble());

    configuracionGeneral->setCeldaGoldenStar(probabilidadesPorCelda["goldenStar"].asDouble());

    configuracionGeneral->setColumnaBlueButton(probabilidadesPorColumna["button"]["b"].asDouble());
    configuracionGeneral->setColumnaGreenButton(probabilidadesPorColumna["button"]["g"].asDouble());
    configuracionGeneral->setColumnaRedButton(probabilidadesPorColumna["button"]["r"].asDouble());
    configuracionGeneral->setColumnaVioletButton(probabilidadesPorColumna["button"]["v"].asDouble());
    configuracionGeneral->setColumnaYellowButton(probabilidadesPorColumna["button"]["y"].asDouble());

    configuracionGeneral->setColumnaBlueMiniBar(probabilidadesPorColumna["miniBar"]["b"].asDouble());
    configuracionGeneral->setColumnaGreenMiniBar(probabilidadesPorColumna["miniBar"]["g"].asDouble());
    configuracionGeneral->setColumnaRedMiniBar(probabilidadesPorColumna["miniBar"]["r"].asDouble());
    configuracionGeneral->setColumnaVioletMiniBar(probabilidadesPorColumna["miniBar"]["v"].asDouble());
    configuracionGeneral->setColumnaYellowMiniBar(probabilidadesPorColumna["miniBar"]["y"].asDouble());

    configuracionGeneral->setColumnaGoldenStar(probabilidadesPorColumna["goldenStar"].asDouble());

    // Tomo las fichas guardadas
    const Json::Value tablero = root["tablero"];
    std::string fila, columna, candy;
    
    for (int i = 0; i < cantFilas; i++) {
		ss.clear();
		ss.str("");
		
        ss << i;
        ss >> fila;
        
        for (int j = 0; j < cantColumnas; j++) {
            ss.clear();
            ss << j;
            ss >> columna;
			
			candy = tablero[fila][columna].asString();
			if (candy.compare("") != 0) {
				(*imagenes)[std::pair<int, int>(i, j)] = candyFromString(candy);
			}
		}
	}
    
    configuracionTablero->setImagenes(imagenes);
}

JSonReader::~JSonReader() { }

BoardConfiguration* JSonReader::getConfiguracionTablero() {
	return configuracionTablero;
}

GeneralConfiguration* JSonReader::getConfiguracionGeneral() { 
	return configuracionGeneral;
}

Candy* JSonReader::candyFromString(std::string jsonName) {
	std::string archivoImagen = "";
	
	if (jsonName.compare(BLUE_BUTTON) == 0) {
		archivoImagen = RUTA_BLUE_BUTTON;
	}else if (jsonName.compare(GREEN_BUTTON) == 0) {
		archivoImagen = RUTA_GREEN_BUTTON;
	}else if (jsonName.compare(RED_BUTTON) == 0) {
		archivoImagen = RUTA_RED_BUTTON;
	}else if (jsonName.compare(VIOLET_BUTTON) == 0) {
		archivoImagen = RUTA_VIOLET_BUTTON;
	}else if (jsonName.compare(YELLOW_BUTTON) == 0) {
		archivoImagen = RUTA_YELLOW_BUTTON;
	}else if (jsonName.compare(BLUE_MINIBAR_H) == 0) {
		archivoImagen = RUTA_BLUE_MINIBAR_H;
	}else if (jsonName.compare(GREEN_MINIBAR_H) == 0) {
		archivoImagen = RUTA_GREEN_MINIBAR_H;
	}else if (jsonName.compare(RED_MINIBAR_H) == 0) {
		archivoImagen = RUTA_RED_MINIBAR_H;
	}else if (jsonName.compare(VIOLET_MINIBAR_H) == 0) {
		archivoImagen = RUTA_VIOLET_MINIBAR_H;
	}else if (jsonName.compare(YELLOW_MINIBAR_H) == 0) {
		archivoImagen = RUTA_YELLOW_MINIBAR_H;
	}else if (jsonName.compare(BLUE_MINIBAR_V) == 0) {
		archivoImagen = RUTA_BLUE_MINIBAR_V;
	}else if (jsonName.compare(GREEN_MINIBAR_V) == 0) {
		archivoImagen = RUTA_GREEN_MINIBAR_V;
	}else if (jsonName.compare(RED_MINIBAR_V) == 0) {
		archivoImagen = RUTA_RED_MINIBAR_V;
	}else if (jsonName.compare(VIOLET_MINIBAR_V) == 0) {
		archivoImagen = RUTA_VIOLET_MINIBAR_V;
	}else if (jsonName.compare(YELLOW_MINIBAR_V) == 0) {
		archivoImagen = RUTA_YELLOW_MINIBAR_V;
	}else if (jsonName.compare(GOLDENSTAR) == 0) {
		archivoImagen = RUTA_GOLDENSTAR;
	}else if (jsonName.compare(HUECO) == 0) {
		archivoImagen = RUTA_HUECO;
	}
	
	return new Candy(archivoImagen, jsonName);
}